n – произвольное натуральное число, которое по некоторым
причинам содержит не менее двух цифр. Джон До, невзрачный человек, выполняет с n следующую операцию: он отбрасывает
последнюю цифру и получает новое число m,
после чего вычисляет n – m . Это его слишком радует. Потом он
называет Вам число n – m. Вы в восторге от подобных
преобразований. Ваша задача по указанной разности восстановить само число n.
Вход. Каждая строка
является отдельным тестом и содержит одно натуральное число от 10 до 1018
включительно, которое равно n – m. Последняя строка содержит 0 и не
обрабатывается.
Выход. Для каждого
теста в отдельной строке вывести все возможные значения n в возрастающем порядке. Последовательно выводимые числа следует
разделять одним пробелом.
Пример
входа |
Пример
выхода |
18 0 |
19 20 |
математика
Пусть n = 10 * x + a, где а – последняя
цифра числа n (0 £ a £ 9). Тогда m = x,
n – m = 10 * x + a – x = 9 * x + a. Обозначим k = n – m. Тогда a = k
mod 9, x = (k – a) / 9.
Очевидно, что искомым будет n = 10 * x + a = 10 * (k – a)
/ 9 + k mod 9.
Если a = k mod 9 = 0, то последняя цифра a
может равняться 9, так как 9 mod 9 = 0. Тогда x = (k – 9) / 9 = k / 9 – 1, откуда n = 10 * x + a = 10 * (k / 9 + 1) + 9.
Таким образом
если значение n – m делится на 9, то существует два разных
значения n. Иначе – одно.
Пример
Если n = 19, то m = 1 и n – m = 18. При n = 20 получим m = 2 и n – m
= 18. Если n – m = 18 (делится на 9), то существует два разных значения n: 19 и 20.
Объявим
переменные a, n, x типа long long.
long long a, k, x;
Вводим k
= n – m. Последовательно вычисляем значения a, x и выводим
результат согласно приведенному выше анализу.
while(scanf("%lld",&k),
k)
{
a = k % 9;
x = (k - a) / 9;
if (!a)
printf("%lld ",10 * (x - 1) + 9);
printf("%lld\n",10
* x + a);
}